package com.hub.netty.client.handler;

import com.hub.netty.base.domain.Message;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.TimeUnit;

@Slf4j
public class ClientListenerHandler extends SimpleChannelInboundHandler<Message> {

    /**
     * 连接服务端
     *
     * @param ctx
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) {
        log.info("{}，连上了服务器", ctx.channel().remoteAddress());
        Message message = new Message();
        message.setId("48:b0:2d:07:58:6c");
        message.setMsgType(1);
        message.setContent("客户端成功连接服务端！");
        ctx.channel().writeAndFlush(message);
        System.out.println("注册成功");


    }

    /**
     * 断开服务端
     *
     * @param ctx
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) {
        log.info("{}断开了服务器", ctx.channel().remoteAddress());
        ctx.fireChannelInactive();
    }


    /**
     * 收到服务端消息
     *
     * @param cx
     * @param message
     */
    @Override
    protected void channelRead0(ChannelHandlerContext cx, Message message) throws InterruptedException {
        log.info("收到服务端的消息:{}", message.getContent());
        TimeUnit.SECONDS.sleep(5);
        log.info("线程阻塞结束");
        if (message.getMsgType() == 3) {
            // 关闭socket连接
            cx.channel().close();
            log.info("{}: 关闭连接", cx.channel().id().asLongText());

        }
    }

    /**
     * 异常发生时候调用
     *
     * @param ctx
     * @param cause
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        log.error("{}连接发生异常", ctx.channel().remoteAddress());
        log.error(cause.getCause().toString());
        ctx.close();
    }
}
